package si.unimb.src.wifisms.control.threads;

import java.io.IOException;

import org.ksoap2.SoapFault;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;

import si.unimb.src.wifisms.communicator.MobidesktopWS;
import si.unimb.src.wifisms.control.BatchSender;
import si.unimb.src.wifisms.entity.*;

/**
 * 
 * @author Ales
 * 
 * Nit, ki preveri veljavnost AuthTokena
 *
 */
public class TokenValidatorRunnable extends AbstractRunnable implements Runnable {

	// Token ki ga preverjamo
	private AuthToken token;
	
	/**
	 * 
	 * Konstruktor za razred. Potrebno je podati BatchSenderja (ki je ta objekt ustvaril)
	 * in AuthToken, ki ga zelimo preveriti.
	 * 
	 * @param parent BatchSender, ki je ta objekt ustvaril
	 * @param token AuthToken, ki ga zelimo preveriti
	 */
	public TokenValidatorRunnable(BatchSender parent, AuthToken token) {
	
		super(parent);
		this.token = token;
		
	}

	/**
	 * 
	 * Implementacija glavne akcije
	 * 
	 */
	@Override
	protected void mainAction() {
		
		boolean valid;
		
		for(byte i = 0; i < Settings.MAX_TRIES; i++) {
		
			// Malo pocakamo pred naslednjo iteracijo (ampak ne prvic)
			if(i > 0) {
				
				try {
					
					Log.d("HelloWS2", "Token validator sleep");
					Thread.sleep(Settings.WAIT_BETWEEN_TRIES);
					
				} catch (InterruptedException e) { }
				
			}
			
			try {
				
				// Je veljavno?
				valid = MobidesktopWS.AuthenticateUser(token.username, token.password);
				
				if(valid) {
				
					token.setStatus(AuthToken.STATUS_VALID);
					
				} else {
				
					token.setStatus(AuthToken.STATUS_INVALID);
					
				}
				
				// Obvestimo vse niti ki posiljajo sporocila, da lahko nadaljujejo
				return;
				
			} catch (SoapFault e) {

				e.printStackTrace();
				
				// SoapFault pomeni da je WS vrgel Exception
				token.setStatus(AuthToken.STATUS_INVALID);
				return;
				
			} catch (IOException e) {

				e.printStackTrace();
				
				// request timeout
				Log.d("HelloWS2", "Token validator IOException: " + e.getMessage());
				
			} catch (XmlPullParserException e) {
				
				e.printStackTrace();
				
				// XmlPullParserException pomeni da je nekaj narobe z XMLom ki se je zgeneriral
				token.setStatus(AuthToken.STATUS_INVALID);
				return;
				
			}
			
		}
		
		// Nismo uspeli ugotoviti (ni se zgodil return stavek)
		token.setStatus(AuthToken.STATUS_UNABLE_TO_CHECK);
		return;

	}

}
